package com.uniflow.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.uniflow.entity.FormData;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 表单数据Mapper接口
 *
 * @author uniflow
 * @since 2024-01-01
 */
@Mapper
public interface FormDataMapper extends BaseMapper<FormData> {

    /**
     * 分页查询表单数据
     */
    IPage<FormData> selectFormDataPage(Page<FormData> page,
                                       @Param("formId") String formId,
                                       @Param("businessKey") String businessKey,
                                       @Param("processInstanceId") String processInstanceId,
                                       @Param("taskId") String taskId,
                                       @Param("status") String status,
                                       @Param("submittedBy") String submittedBy,
                                       @Param("reviewedBy") String reviewedBy,
                                       @Param("startDate") LocalDateTime startDate,
                                       @Param("endDate") LocalDateTime endDate);
    
    /**
     * 根据表单ID和业务键查询表单数据
     */
    FormData selectByFormIdAndBusinessKey(@Param("formId") String formId, 
                                          @Param("businessKey") String businessKey);
    
    /**
     * 根据流程实例ID查询表单数据列表
     */
    List<FormData> selectByProcessInstanceId(@Param("processInstanceId") String processInstanceId);
    
    /**
     * 根据任务ID查询表单数据
     */
    FormData selectByTaskId(@Param("taskId") String taskId);
    
    /**
     * 根据提交人查询表单数据列表
     */
    List<FormData> selectBySubmittedBy(@Param("submittedBy") String submittedBy,
                                       @Param("status") String status);
    
    /**
     * 更新表单数据状态
     */
    int updateStatus(@Param("id") String id,
                     @Param("status") String status,
                     @Param("reviewedBy") String reviewedBy,
                     @Param("reviewedByName") String reviewedByName,
                     @Param("reviewComment") String reviewComment);
    
    /**
     * 批量更新表单数据状态
     */
    int batchUpdateStatus(@Param("ids") List<String> ids,
                         @Param("status") String status,
                         @Param("reviewedBy") String reviewedBy,
                         @Param("reviewedByName") String reviewedByName,
                         @Param("reviewComment") String reviewComment);
    
    /**
     * 获取表单数据统计信息
     */
    Map<String, Object> getFormDataStatistics(@Param("formId") String formId);
    
    /**
     * 根据表单统计数据量
     */
    List<Map<String, Object>> getFormDataCountByForm(@Param("limit") Integer limit);
    
    /**
     * 根据状态统计数据量
     */
    List<Map<String, Object>> getFormDataCountByStatus(@Param("formId") String formId);
    
    /**
     * 根据提交人统计数据量
     */
    List<Map<String, Object>> getFormDataCountBySubmitter(@Param("formId") String formId,
                                                          @Param("limit") Integer limit);
    
    /**
     * 根据时间统计数据量（按天）
     */
    List<Map<String, Object>> getFormDataCountByDate(@Param("formId") String formId,
                                                     @Param("startDate") LocalDateTime startDate,
                                                     @Param("endDate") LocalDateTime endDate);
    
    /**
     * 根据时间统计数据量（按月）
     */
    List<Map<String, Object>> getFormDataCountByMonth(@Param("formId") String formId,
                                                      @Param("startDate") LocalDateTime startDate,
                                                      @Param("endDate") LocalDateTime endDate);
    
    /**
     * 检查业务键是否存在
     */
    boolean existsByBusinessKey(@Param("businessKey") String businessKey, 
                               @Param("excludeId") String excludeId);
    
    /**
     * 根据审核人查询待审核的表单数据
     */
    List<FormData> selectPendingByAssignee(@Param("assignee") String assignee);
    
    /**
     * 根据表单ID删除所有相关数据
     */
    int deleteByFormId(@Param("formId") String formId);
    
    /**
     * 根据流程实例ID删除相关数据
     */
    int deleteByProcessInstanceId(@Param("processInstanceId") String processInstanceId);
    
    /**
     * 检查业务键是否存在（返回数量）
     */
    int checkBusinessKeyExists(@Param("businessKey") String businessKey,
                              @Param("excludeId") String excludeId);
    
    /**
     * 获取待处理的表单数据数量
     */
    int getPendingFormDataCount(@Param("assignee") String assignee);
    
    /**
     * 获取我的表单数据统计
     */
    Map<String, Object> getMyFormDataStatistics(@Param("userId") String userId);
}